package com.neuedu.my12306.web;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.neuedu.my12306.entity.UserInfo;
import com.neuedu.my12306.service.IUserInfoService;
import com.neuedu.my12306.service.impl.IUserInfoServiceImpl;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/LoginServlet.do")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private IUserInfoService userInfoService = null;

	public LoginServlet() {
		super();
		this.userInfoService = new IUserInfoServiceImpl();
	}

	private String getCookiesValue(Cookie[] cookies, String name) {
		if (cookies == null || name == null) {
			return null;
		}
		for (Cookie cookie : cookies) {
			if (name.equals(cookie.getName())) {
				// 在循环中的return语句如何执行?
				return cookie.getValue();

			}
		}
		return null;
	}

	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 1.在接收数据前进行编码转换(统一使用过滤器转换)
		// 2.接收用户输入的参数
		String userName = request.getParameter("userName");
		String userPass = request.getParameter("userPass");
		String validateCode = request.getParameter("validateCode");
		String rand = (String) request.getSession().getAttribute("rand");
		String autoLogin = request.getParameter("autoLogin");

		Cookie[] cookies = request.getCookies();
		String cookieUserName = getCookiesValue(cookies, "userName");
		// System.out.println(cookieUserName);
		if (cookieUserName != null) {
			// 如果是自动登录的流程
			UserInfo userInfo = userInfoService.findUserInfoByid(cookieUserName);
			// System.out.println(userInfo);
			if (userInfo != null) {
				// 自动登录，登陆后自动延长七天
				Cookie cookie = new Cookie("userName", cookieUserName);
				cookie.setPath(request.getContextPath());
				cookie.setMaxAge(7 * 24 * 60 * 60);
				// 把cookie响应回客户端，浏览器客户端会收到会保存到cookie
				response.addCookie(cookie);

				request.getSession().setAttribute("LOGIN_USER", cookieUserName);
				if (userInfo.getUserPower() == 1) {
					response.sendRedirect("Admin/Index.jsp");
				}else {
					response.sendRedirect(request.getContextPath()+"/User/Index.jsp");
				}

			} else {

				request.getRequestDispatcher("/Login.jsp").forward(request, response);
			}

		} else {

			// 3.调用业务层进行登陆处理
			boolean isLogin = false;
			boolean isValidate = rand != null && rand.equalsIgnoreCase(validateCode);
			// 使用逻辑运算的短路特性避免绕过验证码检查
			// 注意：验证码检查需要放在逻辑运算的前面
			UserInfo userInfo = userInfoService.login(userName, userPass);
			if (isValidate &&  userInfo!= null) {
				// 登陆成功
				isLogin = true;

			} else {
				// 登陆失败
			}
			// 4.根据业务处理结果进行返回数据或进行页面跳转
			if (isLogin) {// 登陆成功，进入管理首页
				if (autoLogin != null && "auto".equals(autoLogin)) {
					// 当用户选择了自动登录，且登录成功，需要把用户登录信息返回到浏览器进行记录
					// cookie使用原理（session id的传递与世界就是使用了coolie技术）：
					// 1.服务器返回到客户端的信息可以使用Cookie进行传递，服务器吧数据保存到cookie中，
					// 2.浏览器可以读取到服务器返回的cookie，并保存到浏览器本地
					// 3.浏览器会根据访问地址和本地cookie的有效状态，在每次访问服务器特定页面时会把cookie发送回服务器
					// 4.服务器可以取得客户端发送来的cookie数据
					Cookie cookie = new Cookie("userName", userName);
					cookie.setPath(request.getContextPath());
					cookie.setMaxAge(7 * 24 * 60 * 60);
					// 把cookie响应回客户端，浏览器客户端会收到会保存到cookie
					response.addCookie(cookie);
				}
				// 使用session进行会话跟踪
				request.getSession().setAttribute("LOGIN_USER", userName);
				if (userInfo.getUserPower() == 1) {
					response.sendRedirect("Admin/Index.jsp");// 这是重定向
				}else {
					response.sendRedirect(request.getContextPath()+"/User/Index.jsp");
				}
				
				// request.getRequestDispatcher("Admin/Index.jsp").forward(request,
				// response);//请求转发

			} else {// 登陆失败，返回登陆页面
				request.getRequestDispatcher("Login.jsp").forward(request, response);// 请求转发
			}
		}
	}

}
